import java.util.Arrays;


public class TestDemo {
//    数组的使命：用于存储一组相同数据类型的数据的
//    怎么存、在哪里、怎么取


//  Java中一切皆对象，Java中的数组就是一个对象，一般通过new关键字实例化对象
//    引用类型需要new
    public static void main1(String[] args) {
//        这两者是相同的，创建必须初始化
        int[] array={1,2,3};
        int[] array3=new int[]{1,2,3};

//        创建不初始化
        int[] array2=new int[10];

//        如果省略new T[] 必须一行写完，不能换行
//        int[] array5;
//        array5={1,2,3};//这样写是错误的

        int[] array4;
        array4=new int[]{1,2,3,4};//这样是可以的
    }





    public static void main2(String[] args) {
//        如果不初始化，会有默认初识化的值。
        boolean[] array=new boolean[10];//false
        char[] array1=new char[10];//'\u0000'
    }





//    拓展一下
    public static void main3(String[] args) {
//        和int[] array={1,2,3};,省略了new
        String str=new String("hello");
        String str2="hello";
    }





    public static void main4(String[] args) {
        int[] array={1,2,3,4,5,6,7,8,9};
//        这样修改
        array[0]=99;
        System.out.println(array[0]);
        System.out.println(array.length);//打印数组长度1

        System.out.println(array[-1]);//越界会报错

    }





    public static void main5(String[] args) {
        int[] array={0,1,2,3,0,5,6,7,8,9};

        System.out.println(array);//可以认为此时打印的就是地址

//        按下标遍历打印
        for (int i = 0; i < array.length ; i++) {
            System.out.println(array[i]);
        }
        System.out.println("==================================");
//        不用下标这样打印
        for (int z:array) {
            System.out.println(z);
        }
        System.out.println("==================================");

        Arrays.sort(array);//排序方法

        String ret=Arrays.toString(array);
        System.out.println(ret);
    }


//模拟实现toString
    public static String myToString(int[] array) {
        if(array==null) {
            return "null";
        }
        String ret="[";
        for (int i = 0; i < array.length; i++) {
            ret+=array[i];
            if(array[i]!=array[array.length-1]) {
                ret+=", ";
            }
        }
        ret+="]";
        return ret;
    }

    public static void main6(String[] args) {
        int[] array={1,2,3,4,5};
        System.out.println(myToString(array));
    }


//    数组拷贝
    public static void main7(String[] args) {
        int[] array={1,2,3,4,5};
        int[] ret=Arrays.copyOf(array,array.length);
        ret[0]=6;
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(ret));
    }
//    数组扩容
    public static void main8(String[] args) {
        int[] array={1,2,3,4,5};
        int[] ret=Arrays.copyOf(array,array.length*2);
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(ret));
    }


//    copyOf(int[] orginal,int newlength) {
//      ...
//      System.arraycopy(orginal,srcPos,copy,desPos,length);
//      //这里用的是c/c++实现的本地方法，特点：快
//    };


//    范围拷贝
    public static void main9(String[] args) {
        int[] array={1,2,3,4,5};
        int[] ret=Arrays.copyOfRange(array,1,3);//[1,3)
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(ret));
    }



//    比较数组的值
    public static void main10(String[] args) {
        int[] arr1={1,2,3,4};
        int[] arr2={1,2,3,4};
        System.out.println(Arrays.equals(arr1,arr2));
    }

//    填充方法
    public static void main11(String[] args) {
        int[] arr1={1,2,3,4};
        Arrays.fill(arr1,-1);
        System.out.println(Arrays.toString(arr1));
    }


//    部分填充
    public static void main12(String[] args) {
        int[] ret=new int[10];
        Arrays.fill(ret,1,3,-1);//[1,3)
        System.out.println(Arrays.toString(ret));
    }

//    clone
//    深浅《拷贝》：拷贝之后修改拷贝的值，如果不会影响原来的值为深拷贝；否则为浅拷贝


    //=====================================================
//    二维数组
//    Java中的二维数组不能这样定义：
//    int[][] array={1,2,3,4,5,6,7};
//    这样定义
//    int[][] array={{1,2,3},{4,5,6}}

    public static void main14(String[] args) {
        int[][] array={{1,2,3},{4,5,6}};
        //遍历
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[0].length; j++) {
                System.out.print(array[i][j]);
            }
            System.out.println();
        }
    }
    //三种定义方式：
//    int[][] array1={{1,2,3},{4,5,6}};
//    int[][] array2=new int[][]{{1,2,3},{4,5,6}};
//    int[][] array3=new int[2][3];
//




//    二维数组是特殊的一维数组，Java中把这句话诠释的非常好
//    三种打印方式
    public static void main15(String[] args) {
        int[][] array={{1,2,3},{4,5,6}};
        //打印
        System.out.println(Arrays.toString(array[0]));
        System.out.println(Arrays.toString(array[1]));

        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[0].length; j++) {
                System.out.print(array[i][j]);
            }
            System.out.println();
        }

        for (int[] ret:array) {
            for (int x:ret) {
                System.out.print(x);
            }
            System.out.println();
        }

        System.out.println(Arrays.deepToString(array));
    }

    //Java中二维数组比较牛逼的地方
//    在Java中行不能省略，列能省略
    public static void main16(String[] args) {
        //不指定列时，默认为null
        int[][] array1=new int[2][];
        System.out.println(array1[0]);
        System.out.println(array1[1]);
        //array1[0]=null;


        //牛逼的地方——不规则二维数组
        array1[0]=new int[]{1,2,3};
        array1[1]=new int[]{1,2,3,4,5,6};
    }

    //栈上放的是局部变量！！！
    //引用一定在栈上吗？不是，在不在栈上和是不是引用没有关系



//11-16深夜奋战

    public static void main17(String[] args) {

        int[] array1 ={0,1,2,3,4,5,6,7,8,9};
        double[] array2 ={1.0, 2.0, 3.0, 4.0, 5.0};
        String[] array3 ={"Hello", "Java", "!!!"};
        System.out.println(array1[0]);
        System.out.println(array2[0]);
        System.out.println(array3[0]);
    }

    public static void main(String[] args) {
        int[][] array = {{1,2,3},{4,5,6,7}};
        //输出结果在此验证了，二维数组是特殊的一维数组
//        System.out.println(Arrays.toString(array[0]));
//        System.out.println(Arrays.toString(array[1]));


//        System.out.println("=============");
//        for (int[] ret : array) {
//            for (int x : ret) {
//                System.out.print(x+" ");
//            }
//            System.out.println();
//        }
//        System.out.println("=============");
//        System.out.println(Arrays.deepToString(array));
    }


}



